package nirvana.core.repository;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;

import java.io.Serializable;
import java.util.List;

/**
 * @author Joseph.Li
 * @author joseph.li@king-v.com
 * Created in 2022-06-25 21:06
 */
public interface IRepository<T> extends IService<T> {

    /**
     * 添加
     *
     * @param t
     * @return
     */
    boolean create(T t);


    /**
     * 创建前
     *
     * @param t
     * @return
     */
    T createToBefore(T t);

    /**
     * 创建后
     *
     * @param t
     * @return
     */
    void createdToAfter(T t);


    /**
     * 编辑
     *
     * @param t
     * @return
     */
    boolean edit(T t);


    /**
     * 编辑前
     *
     * @param t
     * @return
     */
    T editToBefore(T t);


    /**
     * 编辑后
     *
     * @param t
     * @return
     */
    void editedAfter(T t);


    /**
     * 当继承了 DomainBaseEntity 类型后，获取时还需要判断 is_delete 字段
     * <p>
     * 应当尝试先从缓存中获取一次，并记录是否成功的从缓存中获取到过
     * <p>
     * 如果在未从缓存中获取，但db中存在数据，则应在缓存中写入
     *
     * @param id
     * @return
     */
    T getById(Serializable id);

    /**
     * 获取已经删除得信息
     * @param id
     * @return
     */
    T getByIdDeleted(Serializable id);


    T getByIdCheck(Serializable id);


    T getToBefore(Serializable id);


    void getToAfter(T t);


    /**
     * 移除
     *
     * @param id
     * @return
     */
    boolean removeById(Serializable id);


    T removeToBefore(Serializable id);


    /**
     * 删除后置操作
     *
     * @param t
     */
    void removedToAfter(T t);


    /**
     * 根据实体类参数获取单条记录
     *
     * @param t
     * @return
     */
    T getByEntity(T t);

    /**
     * 根据实体类参数获取单条记录
     *
     * @param t
     * @return
     */
    List<T> getListByEntity(T t);


    /**
     * 根据id列表获取对象列表
     *
     * @param ids
     * @param isDelete
     * @return
     */
    List<T> getListByIds(List<Long> ids, Boolean isDelete);

    /**
     * @param ids
     * @return
     */
    List<T> getListByIds(List<Long> ids);

    /**
     * 不包含is_delete字段版
     *
     * @param ids
     * @return
     */
    List<T> getListByIdsNotHasDelete(List<Long> ids);


    /**
     * 获取查询包装类
     * 参数为目标类型对象
     *
     * @param t
     * @return
     */
    QueryWrapper<T> getWrapper(T t);


    /**
     * 获取查询包装类
     *
     * @return
     */
    QueryWrapper<T> getWrapper();



    LambdaQueryWrapper<T> getLambdaWrapper(T t);


    LambdaQueryWrapper<T> getLambdaWrapper();


    <F> List<T> getListByFieldValueList(SFunction<T, F> field, List<F> valueList);

    /**
     * 真实删除
     * @param id
     * @return
     */
    Boolean trueDeletion(Serializable id);

    /**
     * 真实批量删除
     * @param ids
     * @return
     */
    Boolean trueDeletionByIds(List<Long> ids);
}
